package com.gjzhao.fmmall.service.impl;

import cn.hutool.core.util.StrUtil;
import com.gjzhao.fmmall.entity.Users;
import com.gjzhao.fmmall.service.UserRegisterService;
import com.gjzhao.fmmall.service.feign.UserAddClient;
import com.gjzhao.fmmall.service.feign.UserCheckClient;
import com.gjzhao.fmmall.utils.MD5Util;
import com.gjzhao.fmmall.vo.RespResultVO;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @Description: 用户注册 ServiceImpl
 * @Author: gjzhao
 * @Date Created in 2022-02-12 11:09 下午
 */
@Service
public class UserRegisterImpl implements UserRegisterService {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private UserCheckClient userCheckClient;
    @Autowired
    private UserAddClient userAddClient;

    @Override
    @Transactional //使用数据库的默认隔离级别，防止在事务A刚查询完用户名是否存在时，事务B就添加了用户
    public RespResultVO insert(String username, String password) {


        RespResultVO resultVO;

        //需要确保锁对象的唯一性
        synchronized (this) {

            //1.调用user-check服务查询用户信息
            Users user = userCheckClient.checkUser(username);

            //判断用户是否存在
            if (user != null) {
                //如果是一个空对象，表示调用了服务降级
                if (StrUtil.isEmpty(user.getUsername())) {
                    logger.debug("-------调用user-check服务失败，进行了服务降级------");
                    resultVO = RespResultVO.failed("网络阻塞，调用user-check服务失败");
                } else {
                    logger.debug("-------用户已存在:{}，不能进行注册------", user.getUsername());
                    resultVO = RespResultVO.failed("用户已存在");
                }

            } else {
                //密码不能直接存在数据库，要使用MD5加密处理，存储加密后的密码
                String md5Pwd = MD5Util.md5(password);
                Users user1 = new Users();
                user1.setUsername(username);
                user1.setPassword(md5Pwd);
                user1.setUserImg("img/default_user_img.png");
                user1.setUserRegtime(new Date());
                user1.setUserModtime(new Date());

                //2.调用user-add服务添加用户信息
                int result = userAddClient.add(user1);
                if (result > 0) {
                    logger.debug("-------注册用户success:{}------", user1);
                    resultVO = RespResultVO.success("注册成功", user1);
                } else if (result == 0) {
                    logger.debug("-------注册用户failed:{}------", user1);
                    resultVO = RespResultVO.failed("注册失败");
                } else {
                    logger.debug("-------调用user-add服务失败，导致注册失败------");
                    resultVO = RespResultVO.failed("注册失败[调用user-add服务失败]");
                }
            }
        }
        return resultVO;
    }

}
